home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 4
/
Aminet 4 - November 1994.iso
/
aminet
/
util
/
gnu
/
gnuplot_3_5.lha
/
gnuplot
/
termcompact.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-12
|
2KB
|
101 lines
/* compact.c -- contains routines to compress a vector stream without
modifying it */
#ifndef COMPACT
/* replaces runs of constant slope in the buffer with single vectors
returns the number of points eliminated */
int compact_slope (xp,yp,isa_move,sz,delta)
int xp[], yp[], isa_move[];
int *sz;
float delta;
{
int dx,dy,old_size,new_index,i,start;
float slope,old_slope;
old_size = *sz;
new_index = 0;
start = 0;
if (xp[1]!=xp[0])
old_slope = (float)(yp[1]-yp[0])/(float)(xp[1]-xp[0]);
else
old_slope = (float)(yp[1]-yp[0])/(float)(0.00001+xp[1]-xp[0]);
for (i=2;i<old_size;i++){
dx = xp[i] - xp[i-1];
dy = yp[i] - yp[i-1];
if (dx!=0)
slope = (float) dy / (float) dx;
else
slope = (float) dy / ((float) dx + 0.00001);
if ((abs(slope-old_slope) > delta)||(isa_move[i])){
xp[new_index] = xp[start];
yp[new_index] = yp[start];
isa_move[new_index] = isa_move[start];
new_index++;
if (start != i-1){
xp[new_index] = xp[i-1];
yp[new_index] = yp[i-1];
isa_move[new_index] = isa_move[i-1];
new_index++;
}
start = i;
/* this is the slope for the new run */
old_slope = slope;
}
}
/* copy the last point into the new array */
xp[new_index] = xp[old_size-1];
yp[new_index] = yp[old_size-1];
isa_move[new_index] = isa_move[old_size-1];
new_index++;
*sz = new_index;
return (old_size - *sz);
}
/* compacts the vector list by compressing runs of constant
dx&dy into one vector
use this if floating point is too expensive!
more naive than compact_slope; doesn't compact as much as possible
returns the number of points eliminated */
int compact_int(xp,yp,isa_move,size)
int xp[],yp[], isa_move[], *size;
{
int dx,dy,old_dx,old_dy,start,index,i,old_size;
start = index = 0;
old_dx = xp[1]-xp[0];
old_dy = yp[1]-yp[0];
for (i=2;i<*size;i++){
dx = xp[i]-xp[i-1];
dy = yp[i]-yp[i-1];
if ((abs(dx-old_dx)+abs(dy-old_dy)!=0)||(isa_move[i])){
/* we've reached the end of a run */
xp[index] = xp[start];
yp[index] = yp[start];
isa_move[index] = isa_move[start];
index++;
if (start != i-1){
xp[index] = xp[i-1];
yp[index] = yp[i-1];
isa_move[index] = isa_move[i-1];
index++;
}
start = i;
old_dx = dx;
old_dy = dy;
}
} /* end for */
/* include the last point */
xp[index] = xp[*size-1];
yp[index] = yp[*size-1];
isa_move[index] = isa_move[*size-1];
index++;
old_size = *size;
*size = index;
return(old_size - *size);
}
#endif
#define COMPACT